home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / p_misc / 7p203upp.exe / V203SRC.LZH / REBUILD.C < prev    next >
C/C++ Source or Header  |  1992-07-12  |  2KB  |  121 lines

  1. #include "7plus.h" 
  2. #include "globals.h"
  3.  
  4. int rebuild (char *line, int flag)
  5. {
  6.   char buf[100], *p;
  7.   uint cs1, cs2, _cs1, _cs2, xcrc;
  8.   int oldcode, c_line, cflag, len, sw, i, j, k, end, end2;
  9.  
  10.   p = buf;
  11.   sw = cflag = oldcode = 0;
  12.   _cs1 = _cs2 = xcrc = 0;
  13.  
  14.   len = (int) strlen (line);
  15.  
  16.   if (flag)
  17.   {
  18.     oldcode = code[215];
  19.     code[215] = 32;
  20.   }
  21.  
  22.   end2 = 216;
  23.   end = -1;
  24.  
  25.   if (len == 69)
  26.     sw  = 1;
  27.  
  28.   if (len == 70)
  29.     sw  = 2;
  30.  
  31.   if (len == 71)
  32.   {
  33.     end = -2;
  34.     end2 = 1;
  35.     sw  = 4;
  36.   }
  37.   if (!sw)
  38.     return (0);
  39.  
  40.   /* Try each character in line */
  41.   for (j=66;j>end;j--)
  42.   {
  43.     fflush (stdout);
  44.     if (sw == 1)
  45.     {
  46.       if (j)
  47.         strncpy (p, line, j);
  48.       strncpy (p+j+1, line+j, 71-j);
  49.       p[71] = EOS;
  50.     }
  51.     if (sw == 2)
  52.       strcpy (buf, line);
  53.  
  54.     if (sw == 4)
  55.     {
  56.       strcpy (p, line);
  57.       strncpy (p+j+1, line+j+2, 70-j);
  58.       p[71] = EOS;
  59.     }
  60.  
  61.     if (!cflag)
  62.     {
  63.       crc2 (&_cs1, p);
  64.       cflag++;
  65.     }
  66.  
  67.     if (j<66)
  68.       xcrc = crctab[xcrc>>8] ^ (((xcrc&255U)<<8) | (byte)p[j+1]);
  69.  
  70.     for (k=0;k<end2;k++)
  71.     {
  72.       if (sw & 3)
  73.         p[j] = code[k];
  74.  
  75.       if (sw == 4)
  76.       {
  77.         cs1 = 0;
  78.         i   = 66;
  79.       }
  80.       else
  81.       {
  82.         cs1 = xcrc;
  83.         i   = j;
  84.       }
  85.  
  86.       for (;i>-1;i--)
  87.         cs1 = crctab[cs1>>8] ^ (((cs1&255U)<<8) | (byte)p[i]);
  88.  
  89.       if (_cs1 == (cs1 & 0x7fffU))
  90.       {
  91.         if (!flag)
  92.         {
  93.           /* Get line number and crc from code line */
  94.           crc_n_lnum (&_cs2, &c_line, p);
  95.           cs2 = 0;
  96.           for (i=0; i<64; i++)
  97.             cs2 = crctab[cs2>>8] ^ (((cs2&255U)<<8) | (byte)p[i]);
  98.           cs2 &= 0x3fff; /* strip calculated CRC to 14 bits */
  99.         }
  100.         else
  101.         {
  102.           if (!mcrc(p, 0))
  103.             continue;
  104.           else
  105.             _cs2 = cs2 = 0;
  106.         }
  107.         if (_cs2 == cs2)
  108.         {
  109.           strcpy (line, buf);
  110.           if (flag)
  111.             code[215] = oldcode;
  112.           return (1);
  113.         }
  114.       }
  115.     }
  116.   }
  117.   if (flag)
  118.     code[215] = oldcode;
  119.   return (0);
  120. }
  121.